import java.util.HashMap;


public class Word {
	
	//private int id;
	private String value;
	/**
	 * HashMap de Hashmap : 
	 * stocke le nombre d'occurence du mot pour
	 * chaque review de chaque categorie (corpus)
	 * 
	 * HashMap<nom du corpus(books, kitchen,...),
	 * 		HashMap<Id de la review, nombre d'occurence dans cette review>>
	 */
	private HashMap<String, HashMap<Integer,Integer>> review;
	/**
	 * nb total d'apparition du mot dans
	 * une review negative
	 */
	private int nbTotalNegative;
	/**
	 * nb total d'apparition du mot dans
	 * une review positive
	 */
	private int nbTotalPositive;
	/**
	 * nb total de review negative dans
	 * lequel le mot apparait
	 */
	private int nbNegativeReview;
	/**
	 * nb total de review positive dans
	 * lequel le mot apparait
	 */
	private int nbPositiveReview;

	public Word(String value, String categorie, int id, String classe) {
		this.value = value;
		this.nbTotalNegative = 0;
		this.nbTotalPositive = 0;
		this.nbNegativeReview = 0;
		this.nbPositiveReview = 0;
		review = new HashMap<String, HashMap<Integer,Integer>>();
		addOccurence(categorie, id, classe, 1);
	}
	
	public String getValue() {
		return value;
	}
	
	public boolean equals(String s) {
		return value.equals(s);
	}
	
	public boolean equals(Object o) {
		return o.equals(value);
	}
	
	/**
	 * Augmente le nombre d'occurence d'apparition du mot
	 * 
	 * @param categorie : nom du corpus (books par exemple)
	 * @param id : l'identifiant de la review (unique)
	 * @param classe : positive ou negative (ou unknown si non apprentissage)
	 * @param nb : nombre d'occurence a rajoute
	 */
	public void addOccurence(String categorie, int id, String classe, int nb) {
		// si le mot n'a jamais ete trouve dans cette categorie
		// alors on cree la categorie
		if(!review.containsKey(categorie)) {
			review.put(categorie, new HashMap<Integer,Integer>());
		}
		HashMap<Integer,Integer> tmp = review.get(categorie);
		if(tmp.containsKey(id)) { // le mot a deja ete trouve dans la review
			if(classe.equals("negative")) {
				nbTotalNegative += nb;
			} else {
				if(classe.equals("positive")) {
					nbTotalPositive += nb;
				}
			}
			tmp.put(id, tmp.get(id) + nb);
		} else { // premiere fois que le mot est trouve dans la review
			if(classe.equals("negative")) {
				++nbNegativeReview;
				nbTotalNegative += nb;
			} else {
				if(classe.equals("positive")) {
					++nbPositiveReview;
					nbTotalPositive += nb;
				}
			}
			tmp.put(id, nb);
		}
	}
	
	public double getTFIDF(Dictionnary dico) {
		return this.getNbTotalPositive() * Math.log(dico.getNbReview() / this.getNbPositiveReview());
	}
	
	public int getNbReview() {
		return nbNegativeReview + nbPositiveReview;
	}

	public HashMap<String, HashMap<Integer, Integer>> getReview() {
		return review;
	}

	public int getNbTotalNegative() {
		return nbTotalNegative;
	}

	public int getNbTotalPositive() {
		return nbTotalPositive;
	}

	public int getNbNegativeReview() {
		return nbNegativeReview;
	}

	public int getNbPositiveReview() {
		return nbPositiveReview;
	}
}
